package com.yin.waimai.service;

import com.yin.waimai.dto.DeliveryPersonDTO;
import com.yin.waimai.enums.DeliveryPersonStatus;
import org.springframework.data.geo.Distance;
import org.springframework.data.geo.Point;

import java.util.List;
import java.util.Optional;

public interface DeliveryPersonService {

    /**
     * 创建新配送人员
     * @param deliveryPersonDTO 配送人员DTO
     * @return 创建后的配送人员
     */
    DeliveryPersonDTO createDeliveryPerson(DeliveryPersonDTO deliveryPersonDTO);

    /**
     * 根据ID查询配送人员
     * @param id 配送人员ID
     * @return 配送人员Optional
     */
    Optional<DeliveryPersonDTO> findById(String id);

    /**
     * 根据电话号码查询配送人员
     * @param phone 电话号码
     * @return 配送人员Optional
     */
    Optional<DeliveryPersonDTO> findByPhone(String phone);

    /**
     * 根据名称查询配送人员
     * @param name 配送人员名称（与用户名相同）
     * @return 配送人员Optional
     */
    Optional<DeliveryPersonDTO> findByName(String name);
    
    /**
     * 获取所有配送人员
     * @return 配送人员列表
     */
    List<DeliveryPersonDTO> findAll();

    /**
     * 根据状态查询配送人员
     * @param status 配送人员状态
     * @return 配送人员列表
     */
    List<DeliveryPersonDTO> findByStatus(DeliveryPersonStatus status);

    /**
     * 更新配送人员信息
     * @param id 配送人员ID
     * @param deliveryPersonDTO 配送人员DTO
     * @return 更新后的配送人员
     */
    DeliveryPersonDTO updateDeliveryPerson(String id, DeliveryPersonDTO deliveryPersonDTO);

    /**
     * 更新配送人员状态
     * @param id 配送人员ID
     * @param status 新状态
     * @return 更新后的配送人员
     */
    DeliveryPersonDTO updateStatus(String id, DeliveryPersonStatus status);

    /**
     * 更新配送人员位置
     * @param id 配送人员ID
     * @param longitude 经度
     * @param latitude 纬度
     * @return 更新后的配送人员
     */
    DeliveryPersonDTO updateLocation(String id, double longitude, double latitude);

    /**
     * 删除配送人员
     * @param id 配送人员ID
     */
    void deleteDeliveryPerson(String id);

    /**
     * 查询指定位置附近的配送人员
     * @param location 位置点
     * @param distance 距离
     * @return 附近的配送人员列表
     */
    List<DeliveryPersonDTO> findNearby(Point location, Distance distance);

    /**
     * 查询指定位置附近的空闲配送人员
     * @param location 位置点
     * @param distance 距离
     * @return 附近的空闲配送人员列表
     */
    List<DeliveryPersonDTO> findNearbyIdle(Point location, Distance distance);

    /**
     * 获取活跃的配送员（非离线状态）
     * @return 配送员DTO列表
     */
    List<DeliveryPersonDTO> getActiveDeliveryPersons();

    /**
     * 获取配送员总数
     * @return 配送员总数
     */
    long countDeliveryPersons();

    /**
     * 检查指定ID的配送员是否存在
     * @param id 配送员ID
     * @return 如果存在返回true，否则返回false
     */
    boolean existsById(String id);
}